home *** CD-ROM | disk | FTP | other *** search
/ 130 MIDI Tool Box / 130 MIDI Tool Box.iso / pmsplit1 / pmsplit.bas
BASIC Source File  |  1987-07-08  |  4KB  |  71 lines

  1. 10  'PMSPLIT.BAS  "POOR MAN'S SPLIT",  BY LES PENNER,  12/21/86
  2. 15  ' Typed in by Jeff Tapia on 7-8-87 as read from
  3. 16  ' Electronic Musician Magazine (EM), July 1987
  4. 20  'PERFORMS KEYBOARD SPLIT OF A MIDI SYNTHESIZER USING MPU-401 INTERFACE
  5. 30  DEFINT A-Z
  6. 40  '#### NEXT EIGHT LINES ARE MPU-401 CODES
  7. 50  DataPort=&H330                         'MPU DATA PORT
  8. 60  StatPort=&H331                         'MPU STATUS PORT
  9. 70  CMDPort =&H331                         'MPU COMMAND PORT
  10. 80  DSRMask=&H80                           'DATA-SEND-READY MASK
  11. 90  DRRMask=&H40                           'DATA-RECEIVE-MASK
  12. 100 ACK     =&HFE                          'ACKNOWLEDGE
  13. 110 RST     =&HFF                          'MPU-401 Reset
  14. 120 DISM    =&H8B                          'DATA IN STOP MODE
  15. 130 WTSD    =&HD0                          'WANT TO SEND DATA
  16. 140 '#### NEXT TWO LINES ARE MIDI CODES
  17. 150 NoteOnOff=&H90 'MIDI NOTE ON/OFF CODE FOR CHANNEL 0
  18. 160 ChangePatch=&HC0                       'MIDI CHANGE PATCH
  19. 180 CLS : LOCATE 10,1
  20. 190 INPUT "Enter the key number for the split:",SplitKey
  21. 200 INPUT "Enter the patch number for the upper section:",HiPatch
  22. 210 Input "Enter the patch number for the lower section:",LoPatch
  23. 220 Print "Ready to play.  Press BREAK to terminate . . ."
  24. 230 Command=Rst : GoSub 520                'Send Reset Command
  25. 240 Command=Dism: Gosub 520                'Send Data-In-Stop Mode
  26. 250 Continue=1
  27. 260 While Continue=1: Gosub 450            'Get a byte from MPU-401
  28. 270   If InData=NoteOnOff then gosub 450   'If it is &H90 then get another
  29. 280   Note=InData:Gosub 450                'Get anouther byte from MPU-401
  30. 290   Velocity=InData                      'Velocity (volume)byte - not used
  31. 300   If Note>=SplitKey then NewRange=1 else NewRange=0 ' 1=upper, 0=lower
  32. 310   If ((NewRange=1)and(OldRange=0)) then Range=HiPatch
  33. 320     Gosub 650                          'Change from lower to upper patch
  34. 330   If ((NewRange=0)and(OldRange=1)) then Range=LoPatch
  35. 340     Gosub 650                          'Change from upper to lower patch
  36. 350   OldRange=NewRange
  37. 360 Wend
  38. 370 End
  39. 380 '#### Routine to send data to MPU-401
  40. 390 Status=&HFF
  41. 400 While not((Status and DRRMask)=0)      'Read Status Port until DRR is 0
  42. 410   Status=Inp(StatPort)
  43. 420 Wend
  44. 430 Out DataPort, OutData                  'Then send data to Data Port
  45. 440 Return
  46. 450 '#### Routine to send data to MPU-401
  47. 460 Status=&HFF
  48. 470 While not((Status and DSRMask)=0)       'Read Status Port until DSR is 0
  49. 480   Status=Inp(StatPort)
  50. 490 Wend
  51. 500 InData=Inp(DataPort)                   'Then read from Data Port
  52. 510 Return
  53. 520 '#### Routine to send a command to MPU-401
  54. 530 Status=&HFF : InData=&HFF : W=&HFF
  55. 540 While Not((Status and DRRMask)=0)      'Read Status port until DRR=0
  56. 550   Status=INP(StatPort)
  57. 560 Wend
  58. 570 Out CMDPort,Command                    'Then send the command to the CMDPort
  59. 580 While not(InData=Ack)                  'Start Looking for acknowledge from MPU-401
  60. 590   While Not((W and DSRMask)=0)         'Read Status Port Until DSR=0)
  61. 600     W=Inp(StatPort)                    'Read the Status Port byte
  62. 610   Wend
  63. 620   gosub 450                            'Get the data byte to see if it is Ack
  64. 630 Wend
  65. 640 Return
  66. 650 '#### Routine to switch to patches
  67. 660 Command=WTSD: Gosub 520                'Send Want-To-Send-Data command
  68. 670 OutData=ChangePatch: Gosub 380         'Send MIDI code to change patch
  69. 680 OutData=Range: Gosub 380               'Send data byte for new patch
  70. 690 Return
  71.